跳到主要内容

1.3 有符号的二进制数

一般来说,我们用没有符号表示的数来表示正数(无符号数),而用“减号”(负号)表示负数。然而,这些表示方法并不适用于像计算机这样的数字系统,因为数据是以二进制数表示的。因此,需要一种特殊的表示法来表示符号。

正数的二进制表示

最高有效位(MSB)为0的二进制数称为“正数的二进制数”。

alt text

负数的二进制表示

最高有效位(MSB)为1的二进制数称为“负数的二进制数”。

alt text

无符号数可以有很宽的表示范围。然而,对于有符号数,其表示范围只能从 (2(n1)1)- (2^{(n-1)} - 1)+(2(n1)1)+ (2^{(n-1)} - 1),其中 nn 是位数(包括符号位)。

例如,对于一个5位有符号二进制数(包括4位数值位和1位符号位),其范围为:

(2(51)1) 到 +(2(51)1)- (2^{(5-1)} - 1) \text{ 到 } + (2^{(5-1)} - 1)
(241) 到 +(241)-(2^{4} - 1 ) \text{ 到 } + (2^{4} - 1)
15 到 +15-15 \text{ 到 } +15

8位无符号二进制数的范围为0到255。8位有符号二进制数的最大值和最小值如下所示。

最大正数为:0111 1111,即 +127+127

最大负数为:1000 0000,即 127-127

alt text

由于我们不能将正负号输入到数字系统中,因此需要用其他方式来表示这些符号。在计算机中,表示负数有三种常见方法,分别是:

  • 符号-数值表示法
  • 1的补码表示法
  • 2的补码表示法

符号-数值表示法

可以通过最高有效位(MSB)来判断二进制数是正数还是负数的数称为“有符号二进制数”。

例如:1001 → +9(正数);1 001 → –1(负数)

这是在二进制系统中表示正数和负数的最简单方法。在符号-数值表示法中:

  • 正数用其最高有效位(MSB)为‘0’来表示。
  • 负数用其最高有效位(MSB)为‘1’来表示。
alt text

1的补码表示法

1的补码是另一种将负二进制数输入到计算机中的方法。在1的补码方法中,正二进制数保持不变,而负数则通过对无符号正数取1的补码来表示。

正数的最高有效位(MSB)始终为0,而负数的最高有效位(MSB)始终为1。

1的补码是通过将所有0替换为1,将所有1替换为0来生成的。

例如,如果一个二进制数是01101001,那么它的1的补码是10010110。

让我们再来看一些关于1的补码的例子。

例133=?-33 = ?

33的二进制表示为 1000012100001_2

在8位表示法中,它表示为 0010000120010 0001_2

现在,-33用1的补码表示为 1101111021101 1110_2

例2127=?-127 = ?

在8位表示法中,127表示为 0111111120111 1111_2

现在,-127用1的补码表示为 1000000021000 0000_2

例31=?-1 = ?

1的二进制表示为 0012001_2

在8位表示法中,它表示为 0000000120000 0001_2

现在,-1用1的补码表示为 1111111021111 1110_2

使用反相器求1的补码

对于数字电子电路来说,求一个数的1的补码的最简单方法是使用“反相器”。顾名思义,反相器是一种设备/电路,它生成输入的补码。

alt text

反相器并联连接,以获得输入二进制数的1的补码。无论一个二进制数有多少位数字,我们都可以很容易地找到它的1的补码。只需将所有的0写成1,将所有的1写成0,就可以得到一个二进制数的1的补码。

在二进制数上进行的数学运算称为“二进制算术”。我们可以通过多种方式对任何正数或负数进行加法或减法运算,例如 A+BA + BA+(B)A + (-B)B+A-B + A 等。

有符号二进制数的加法

二进制加法也遵循与普通加法相同的规则。但这里唯一的例外是,数学运算只在两个数字(0和1)之间进行,且始终有 1>01 > 0

alt text

二进制加法的规则如下:

alt text

使用1的补码进行减法

要从另一个二进制数中减去一个数,首先需要将其转换为其1的补码。

使用1的补码进行负数减法运算有以下3种可能的情况。

情况1:负数小于正数。

例如:(28)10(28)_{10}(15)10(-15)_{10}

我们知道28在二进制数系统中表示为 0111002011100_2

15在二进制数系统中表示为 01111201111_2

15的1的补码是 10000210000_2,即 15-15

alt text

结果为 (13)10(13)_{10},在二进制系统中表示为 0011010 01101

情况2:负数大于正数。

例如:(28)10(-28)_{10}(15)10(15)_{10}

我们知道28在二进制数系统中表示为 0111002011100_2

15在二进制数系统中表示为 01111201111_2

28的1的补码是 1000112100011_2,即 28-28

alt text

结果为 (13)10(-13)_{10},在二进制系统中表示为 1100101 10010

情况3:两个数都是负数。

例如:(28)10(-28)_{10}(15)10(-15)_{10}

我们知道28在二进制数系统中表示为 0111002011100_2

28的1的补码是 1000112100011_2,即 28-28

15在二进制数系统中表示为 01111201111_2

15的1的补码是 10000210000_2,即 15-15

alt text

结果为 (43)10(-43)_{10},在二进制系统中表示为 10101001010100

有符号二进制数的2的补码
求2的补码的过程类似于求十进制数的10的补码的过程。要找到一个二进制数的2的补码,首先需要找到该数的1的补码,然后在1的补码上加“1”。

正数的2的补码表示与1的补码和符号-数值表示相同。

求2的补码涉及以下两个步骤:

步骤1:求1的补码

步骤2:在无符号数结果上加“1”

让我们通过一些例子来理解这一点。

例1:33=?-33 = ?

33的二进制表示为 1000012100001_2

在8位表示法中,它表示为 0010000120010 0001_2

现在,-33用1的补码表示为 1101111021101 1110_2

加上1(0000 0001),结果为 1101111121101 1111_2

因此,-33的2的补码是 1101111121101 1111_2

例2:127=?-127 = ?

在8位表示法中,127表示为 (0111 1111)2(0111\ 1111)_2

现在,-127用1的补码表示为 (1000 0000)2(1000\ 0000)_2

加上1 (0000 0001)2(0000\ 0001)_2 后,

结果为 (1000 0001)2(1000\ 0001)_2

因此,-127的2的补码是 (1000 0001)2(1000\ 0001)_2

例3:1=?-1 = ?

1表示为 (001)2(001)_2

在8位表示法中,它表示为 (0000 0001)2(0000\ 0001)_2

现在,-1用1的补码表示为 (1111 1110)2(1111\ 1110)_2

加上1 (0000 0001)2(0000\ 0001)_2 后,

结果为 (1111 1111)2(1111\ 1111)_2

因此,-1的2的补码是 (1111 1111)2(1111\ 1111)_2

alt text

有符号二进制数总结

可以通过最高有效位(MSB)来识别的二进制数称为“有符号二进制数”。

如果MSB为1,则为“负有符号二进制数”。例如:1=1001-1 = 1001

如果MSB为0,则为“正有符号二进制数”。例如:+9=0001+9 = 0001

计算机无法理解减号。因此,为了将负数输入到计算机中,我们采用以下3种特殊方法:

  • 符号-数值表示法
  • 1的补码表示法
  • 2的补码表示法

1的补码表示为“将所有的1替换为0,将所有的0替换为1”。

例如:15的1的补码,即 15-15,表示为 (10000)2(10000)_2,即 15-15

2的补码表示为“在所需数的1的补码上加1”。

例如:-33的2的补码是 (1101 1111)2(1101\ 1111)_2

二进制数的加法和减法等数学运算称为“二进制算术运算”。